home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 361_01 / cat.c < prev    next >
C/C++ Source or Header  |  1991-09-18  |  4KB  |  140 lines

  1.  
  2. /* CAT ---> Like the Unix "cat" w/ more options
  3.  *
  4.  * J.Ekwall   2 May 89
  5.  *
  6.  * Copyrighted to the Public Domain.  Unlimited Distribution Authorized.
  7.  *
  8.  * User Assumes All Risks/Liabilities.
  9.  *
  10.  * Last Update:  25 September 89/EK
  11.  */
  12.  
  13. #include <stdio.h>
  14. #include <ctype.h>
  15. #include <io.h>
  16. #include <stdek.h>
  17.  
  18. /* Declare ProtoTypes */
  19. void Bag(int);
  20. void Usage(void);
  21.  
  22. /* Declare Globals */
  23. char *tp1, *tp2, *tpf = 0, Queue[128];
  24. char Stdname[12] = "\\STD ";
  25.  
  26. main (int argc, char *argv[])
  27. {
  28.     int i, c, x, Flag = FALSE;
  29.     int Part = 1, Step = 100, Bump = 100;
  30.     FILE *fp;
  31.  
  32.  /* Check for Arguements */
  33.     if (argc IS 1) Usage();
  34.  
  35.  
  36.  /* Check for File List */
  37.     if (*argv[1] != '/') {
  38.        for (i = 1; i < argc; i++) {
  39.           tp1 = argv[i]; if (*tp1 IS '/') Usage();
  40.           if (*tp1 IS '-' && *(tp1 +1) IS NULL) {
  41.              if (isatty(0) != FALSE) Usage();
  42.              while ((c = getchar()) != EOF) putchar(c);
  43.              continue;
  44.           }
  45.           if (*tp1 IS '$'){
  46.              tp1++; tp2 = Stdname + 5;
  47.              while (*tp1 != NULL) *tp2++ = *tp1++;
  48.              *tp1 = NULL; tp1 = Stdname;
  49.           }
  50.           if ((fp = fopen(tp1, "rt")) IS NULL) {
  51.              fprintf(stderr,"Cannot Open %s.\n",tp1);
  52.              continue;
  53.           }
  54.           while ((c = getc(fp)) != EOF) putchar(c);
  55.           fclose(fp);
  56.        }
  57.        exit(0);
  58.     }
  59.  
  60.  /* Must be a Filter Action */
  61.     if (argc != 2) Usage();
  62.     tp1 = argv[1]; if (*tp1++ != '/') Usage();
  63.     x = toupper(*tp1++); if (*tp1 != NULL) Usage();
  64.  
  65.  /* Flow Thru & Do Indicated Action */
  66.     while ((c = getchar()) != EOF) {
  67.        if (x IS 'Q') { Bag(c); continue; }
  68.        if (Flag IS FALSE) {
  69.           if ((x IS 'U') && (c != '.')) continue;
  70.           Flag = TRUE;
  71.           if (x IS 'N') printf("%d. ",Part++);
  72.           if (x IS 'T') {
  73.              printf("%04d.%04d ",Part, Step);
  74.              Step += Bump;
  75.              if (Step > 9999) { Part++; Step = 0; }
  76.           }
  77.        }
  78.        if ((Flag IS TRUE) && (x IS 'U')) {
  79.           if (c != SPACE) continue;
  80.           Flag++; continue;
  81.        }
  82.        putchar(c);
  83.        if (c IS NL) Flag = FALSE;
  84.     }
  85.     if (x IS 'Q') Bag(EOF);
  86.     exit (0);
  87.  
  88. }
  89.  
  90. void Bag(int c)
  91. {
  92.    static int i, j, s;
  93.  
  94.    if (tpf IS 0) {
  95.       tpf = Queue + 127;
  96.       tp1 = tp2 = Queue;
  97.       i = j = s = 0;
  98.    }
  99.  
  100.    if (c IS EOF) {
  101.       while(tp1 != tp2) { putchar(*tp2++); if (tp2 IS tpf) tp2 = Queue; }
  102.       putchar(NL);
  103.       exit(0);
  104.    }
  105.  
  106.  /* Do Business */
  107.     if ((c IS CR) || (c IS SUB)) return;
  108.     i++; if (c IS NL) { s = i; c = SPACE; }
  109.  
  110.  /* Push a CHR$ onto the Circular Queue */
  111.     *tp1++ = c; if (tp1 IS tpf) tp1 = Queue;
  112.  
  113.  /* Check for Enough to Stream Out */
  114.     if (i < 75) return;
  115.     for (j = s; j > 0; j--) {
  116.        i--; putchar(*tp2++); if (tp2 IS tpf) tp2 = Queue; }
  117.     putchar(NL);
  118.  
  119. }
  120.  
  121. void Usage()
  122. {
  123.     fprintf(stderr, "\nUsage:\n");
  124.     fprintf(stderr,
  125. "       CAT [/Option or file list] ---> Stream Text to Stdout.\n");
  126.     fprintf(stderr, "\n/Options:\n");
  127.     fprintf(stderr,
  128. "    /Q ---> Stack Stdin Lines into 75 CHR$ max lines.\n");
  129.     fprintf(stderr,
  130. "    /N ---> Add Line Numbers to Each Stdin Line.\n");
  131.     fprintf(stderr,
  132. "    /T ---> Add TEKTEST Line Numbers to Each Stdin Line.\n");
  133.     fprintf(stderr,
  134. "    /U ---> Remove Line Numbers from Each Stdin Line.\n\n");
  135.     fprintf(stderr, "File List:\n");
  136.     fprintf(stderr,
  137. "    File Names (Wild Cards OK), $pipe or \"-\" for Stdin.\n\n");
  138.     exit(1);
  139. }
  140.